package com.springboot.study.entity;
// Lombok 注解，可以自动生成无参构造、所有参数构造、Getter/Setter、toString 等（这里没用，但通常搭配）
// import lombok.AllArgsConstructor;
// import lombok.Data;
// import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * User 实体类，用于绑定 application.yml 或 application.properties 中以 "users" 开头的配置
 * 通过 @Component 让 Spring 管理此类为 Bean
 * 通过 @ConfigurationProperties(prefix = "users") 绑定配置文件中的 users.* 属性到本类字段
 * 这里也有用 @Value 注解读取单个配置（但使用 @ConfigurationProperties 时一般不需要 @Value）
 *
 * 备注：
 * @ConfigurationProperties(prefix = "users") 绑定属性时，通常不需要配合 @Value，这两种方式本质上是读取配置的两种不同方法，混用容易出问题。
 * 推荐写法是去掉 @Value 注解，只用 @ConfigurationProperties，同时确保启动类或配置类有启用支持：
 */
@Component
@ConfigurationProperties(prefix = "users")
public class User {

    // 通过 @Value 注解绑定配置文件中的 users.name
    // 这里有点重复，建议只用 @ConfigurationProperties 绑定，不必写 @Value
    //@Value("${users.name}")
    private String name;

    // 通过 @Value 注解绑定配置文件中的 users.age
    //@Value("${users.age}")
    private Integer age;

    // 无参构造器，Spring 反射实例化 Bean 需要
    public User() {

    }

    // 全参构造器（你写的，但 Spring Boot 绑定配置时默认使用无参构造 + setter）
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    // getter：获取用户名字
    public String getName() {
        return name;
    }

    // setter：设置用户名字
    public void setName(String name) {
        this.name = name;
    }

    // getter：获取用户年龄
    public Integer getAge() {
        return age;
    }

    // setter：设置用户年龄
    public void setAge(Integer age) {
        this.age = age;
    }

    // 重写 toString 方法，方便打印 User 对象信息
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
